package br.edu.univas.si.lab3.bankmanager.controller;

import java.util.regex.Pattern;

import br.edu.univas.si.lab3.bankmanager.listeners.AlteraListener;
import br.edu.univas.si.lab3.bankmanager.model.ClienteTO;
import br.edu.univas.si.lab3.bankmanager.model.DAO;
import br.edu.univas.si.lab3.bankmanager.model.DAOException;
import br.edu.univas.si.lab3.bankmanager.view.FrameBusca;
import br.edu.univas.si.lab3.bankmanager.view.FrameNovoDado;
import br.edu.univas.si.lab3.bankmanager.view.FrameUpdateOp;

public class ControllerAltera {

	private DAO dao;
	private FrameBusca busca;
	private FrameUpdateOp updateOp;
	private FrameNovoDado novoDado;
	private ClienteTO cliente;
	private String chave;
	private String op;
	private Integer menssagem = 0;
	
	
	public ControllerAltera(DAO dao) {
		this.dao = dao;
	}

	public void alterarDados(ClienteTO cliente) {
		Integer modificador = 6;
		this.cliente = cliente;
		busca = new FrameBusca(this.cliente, modificador);
		busca.addAlteraListeners(new AlteraListener() {
			@Override
			public void buscaCliente(String chave) throws DAOException {
				verificaCliente(chave);
			}
			@Override
			public void alteraCancelado() {
				busca.dispose();
			}
			@Override
			public void alterarDado(String dado) {}
		});
		busca.setVisible(true);
	}

	private void verificaCliente(String chave) throws DAOException {
		Boolean clienteExiste = dao.buscaCliente(chave);
		if(clienteExiste){
			busca.dispose();
			this.chave = chave;
			updateOp = new FrameUpdateOp(cliente);
			updateOp.addAlteraListeners(new AlteraListener() {
				@Override
				public void buscaCliente(String chave) {}
				
				@Override
				public void alterarDado(String dado) {
					updateOp.dispose();
					getNewInfo(dado);
				}
				
				@Override
				public void alteraCancelado() {
					updateOp.dispose();
				}
			});
			updateOp.setVisible(true);
		}
		else
			busca.getMessage(0);
		busca.dispose();
		
	}
	
	private void getNewInfo(String dado){
		this.op = dado;
		novoDado = new FrameNovoDado(dado);
		novoDado.addListarListeners(new AlteraListener() {
			
			@Override
			public void buscaCliente(String chave) {}
			
			@Override
			public void alterarDado(String dado) throws DAOException {
				if(dadoOK(dado,op))
					setNewInfo(dado);
				else
					novoDado.getMessage(menssagem);
				
			}
			

			@Override
			public void alteraCancelado() {
				novoDado.dispose();
			}
		});
		novoDado.setVisible(true);
	}
	
	private void setNewInfo(String dado) throws DAOException {
		dao.update(dado,chave,op);
		novoDado.getMessage(1);
		novoDado.dispose();
		
	}
	
	private boolean dadoOK(String dado, String op) {
		if(op.equalsIgnoreCase("nome")){
			
				return true;
			
		}
		else if(op.equalsIgnoreCase("endereco")){
			
				return true;
			
		}
		else if(op.equalsIgnoreCase("bairro")){
			
				return true;
			
		}
		else if(op.equalsIgnoreCase("cidade")){
			
				return true;
			
		}
		else if(op.equalsIgnoreCase("estado")){
			
				return true;
			
		}
		else if(op.equalsIgnoreCase("cep")){
			if(dado.equalsIgnoreCase("_____-___")){
				menssagem = 7;
				return false;
			}
			else
				return true;
		}
		else if(op.equalsIgnoreCase("telefone")){
			if(dado.equalsIgnoreCase("(__) ____-____")){
				menssagem = 8;
				return false;
			}
			else
				return true;
		}
		else if(op.equalsIgnoreCase("email")){
			if(Pattern.matches("[a-zA-Z0-9]+@hotmail.com", dado) ||
			   Pattern.matches("[a-zA-Z0-9]+@yahoo.com", dado) ||
			   Pattern.matches("[a-zA-Z0-9]+@gmail.com", dado) ){
				return true;
			}
			menssagem = 9;
		}
		else if(op.equalsIgnoreCase("datanascimento")){
			if(dado.equalsIgnoreCase("__/__/____")){
				menssagem = 10;
				return false;
			}
			else
				return true;
		}
		else if(op.equalsIgnoreCase("representante")){
			
				return true;
			
		}
		else if(op.equalsIgnoreCase("razaosocial")){
			
				return true;
			
		}
		return false;
	}
	
}
